design smell
when clumps of data or encoded strings are used instead of creating an abstraction.
Also known as "primitive obsession" and "data clumps".
when an abstraction has multiple responsibilities assigned to it.
Also known as "conceptualization abuse".
when two or more abstractions have identical names or implementation or both.
Also known as "alternative classes with different interfaces" and "duplicate design artifacts".
when the declared accessibility of one or more members of an abstraction is more permissive than actually required.
when client code uses explicit type checks (using chained if-else or switch statements that check for the type of the object) instead of exploiting the variation in types already encapsulated within a hierarchy.
when data and/or methods that ideally should have been localized into a single abstraction are separated and spread across multiple abstractions.
when an abstraction exists that has not been completely decomposed, and a further decomposition could reduce its size, implementation complexity, or both.
when two or more abstractions depend on each other directly or indirectly (creating a tight coupling between the abstractions).
Also known as "cyclic dependencies".
when a supertype in a hierarchy depends on any of its subtypes.
Also known as "inheritance/reference cycles".
when there is unnecessary duplication among types in a hierarchy.
when a supertype and its subtype conceptually do not share an “IS-A” relationship resulting in broken substitutability.
Also known as "inappropriate use of inheritance" and "misapplying IS A".